"""
数据分析模块路由
实现数据采集统计相关的API接口
"""
from fastapi import APIRouter, Depends

from app.common.auth import require_analytics_view
from app.common.common import DbDep, AuditLogDep
from app.schemas.analytics_schemas import (
	ConsumptionStatsRequest, ConsumptionStatsResponse,
	AlarmStatsRequest, AlarmStatsResponse,
	DeviceInventoryRequest, DeviceInventoryResponse,
	DeviceDailyConsumptionRequest, DeviceDailyConsumptionResponse
)
from app.schemas.user_schemas import UserInDB
from app.service.analytics_service import AnalyticsService
from common.exceptions import BizException
from common.logger import create_logger
from common.response import ApiResponse

logger = create_logger("analytics_router")

router = APIRouter(prefix="/analytics", tags=["数据分析"])


@router.post("/consumption", response_model=ApiResponse[ConsumptionStatsResponse],
			 summary="用量统计",
			 description="统计指定区域、台区或设备在时间段内的用电量，包括总用电量、分相用电量、日均用电量和峰值功率等指标")
async def consumption_stats(
		db: DbDep,
		_audit: AuditLogDep,
		request: ConsumptionStatsRequest,
		current_user: UserInDB = Depends(require_analytics_view),
) -> ApiResponse[ConsumptionStatsResponse]:
	"""
	统计指定区域、台区或设备在时间段内的用电量

	参数:
	- request: 用量统计请求参数，包括台区ID、设备ID、时间范围和统计粒度

	返回:
	- ApiResponse[ConsumptionStatsResponse]: 用量统计结果，包含总用电量、分相用电量、日均用电量和峰值功率等
	"""
	try:
		logger.info(f"用户 {current_user.username} 请求用量统计数据")
		result = await AnalyticsService.get_consumption_stats(db, request)
		logger.info(f"用量统计成功完成")
		return ApiResponse.success(data=result, message="用量统计成功")
	except BizException as e:
		return ApiResponse.error(
			message=e.error_message,
			code=e.error_code.http_code,
			error_code=e.error_code.biz_code
		)
	except Exception as e:
		logger.error(f"用量统计系统异常: {e}", exc_info=True)
		return ApiResponse.error(message=f"用量统计失败: {str(e)}", code=500)


@router.post("/alarms", response_model=ApiResponse[AlarmStatsResponse],
			 summary="告警事件统计",
			 description="统计告警事件的数量、分布和趋势，支持按状态、类型、时间等维度进行统计分析")
async def alarm_stats(
		db: DbDep,
		_audit: AuditLogDep,
		request: AlarmStatsRequest,
		current_user: UserInDB = Depends(require_analytics_view),
) -> ApiResponse[AlarmStatsResponse]:
	"""
	统计告警事件的数量、分布和趋势

	参数:
	- request: 告警统计请求参数，包括分组方式和时间范围

	返回:
	- ApiResponse[AlarmStatsResponse]: 告警统计结果，包含按状态、类型、时间趋势和设备排名的统计数据
	"""
	try:
		logger.info(f"用户 {current_user.username} 请求告警统计数据")
		result = await AnalyticsService.get_alarm_stats(db, request)
		logger.info(f"告警统计成功完成")
		return ApiResponse.success(data=result, message="告警统计成功")
	except BizException as e:
		logger.warning(f"告警统计业务异常: {e}")
		return ApiResponse.error(message=e.message, code=e.error_code.INTERNAL_SERVER_ERROR.value)
	except Exception as e:
		logger.error(f"告警统计系统异常: {e}", exc_info=True)
		return ApiResponse.error(message=f"告警统计失败: {str(e)}", code=500)


@router.post("/device-inventory", response_model=ApiResponse[DeviceInventoryResponse],
			 summary="区域设备资产统计",
			 description="统计省、市、区各级行政区划下的设备资产总量和分布情况，包括台区、电箱、电表等设备的统计信息")
async def device_inventory_stats(
		db: DbDep,
		_audit: AuditLogDep,
		request: DeviceInventoryRequest,
		current_user: UserInDB = Depends(require_analytics_view),
) -> ApiResponse[DeviceInventoryResponse]:
	"""
	统计省、市、区各级行政区划下的设备资产总量和分布情况

	参数:
	- request: 设备资产统计请求参数，包括省份编码、城市编码和区县编码

	返回:
	- ApiResponse[DeviceInventoryResponse]: 设备资产统计结果，包含各级设备的总数和分布情况
	"""
	try:
		logger.info(f"用户 {current_user.username} 请求设备资产统计数据")
		result = await AnalyticsService.get_device_inventory_stats(db, request)
		logger.info(f"设备资产统计成功完成")
		return ApiResponse.success(data=result, message="设备资产统计成功")
	except BizException as e:
		logger.warning(f"设备资产统计业务异常: {e}")
		return ApiResponse.error(message=e.message, code=e.error_code.INTERNAL_SERVER_ERROR.value)
	except Exception as e:
		logger.error(f"设备资产统计系统异常: {e}", exc_info=True)
		return ApiResponse.error(message=f"设备资产统计失败: {str(e)}", code=500)


@router.post("/device-daily-consumption", response_model=ApiResponse[DeviceDailyConsumptionResponse],
			 summary="设备用电量统计")
async def device_daily_consumption(
		db: DbDep,
		_audit: AuditLogDep,
		request: DeviceDailyConsumptionRequest,
		_: UserInDB = Depends(require_analytics_view),
) -> ApiResponse[DeviceDailyConsumptionResponse]:
	"""
	设备每日用电量统计

	参数:
	- serial_no: 设备序列号（可选）
	- station_id: 台区ID（可选）
	- start_time: 开始时间
	- end_time: 结束时间
	
	注意：
	- 必须提供 serial_no 或 station_id 之一
	- 提供 serial_no时查询单个设备的用电量
	- 提供station_id时查询整个台区的用电量（汇总）

	返回:
	- ApiResponse[DeviceDailyConsumptionResponse]: 设备每日用电量统计结果，包含每日用电量数据、总用电量和日均用电量
	"""
	try:
		result = await AnalyticsService.get_device_daily_consumption(db, request)
		logger.info(f"设备用电量统计成功完成")
		return ApiResponse.success(data=result, message="设备用电量统计成功")
	except BizException as e:
		return ApiResponse.error(
			message=e.error_message,
			code=e.error_code.http_code,
			error_code=e.error_code.biz_code
		)
	except Exception as e:
		logger.error(f"设备用电量统计系统异常: {e}", exc_info=True)
		return ApiResponse.error(message=f"设备用电量统计失败: {str(e)}", code=500)
